package com.seeyon.apps.ndk.kit;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.seeyon.cap4.form.bean.FormBean;
import com.seeyon.cap4.form.bean.FormFieldBean;
import com.seeyon.cap4.form.bean.FormTableBean;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.authenticate.domain.User;
import com.seeyon.ctp.common.log.CtpLogFactory;
import com.seeyon.ctp.util.UUIDLong;
import org.apache.commons.logging.Log;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JsonKit {
    private static final Log log = CtpLogFactory.getLog(JsonKit.class);
    private static String localAddr = AppContext.getRawRequest().getLocalAddr();
    private static String port = String.valueOf(AppContext.getRawRequest().getLocalPort());
    private static String tokenUrl = "http://" + localAddr + ":" + port + "/seeyon/rest/token";
    private static String fileUrl = "http://" + localAddr + ":" + port + "/seeyon/rest/attachment?token=";


    /**
     * 从给定的JSON数组和文件JSON数组中提取主要数据，并返回一个包含这些数据的Map对象。
     *
     * @param jsonArray     包含JSON对象的数组
     * @param fileJsonArray 包含文件JSON对象的数组
     * @param formFields    包含表单字段的列表
     * @return 包含主要数据的Map对象
     * @throws Exception 如果在处理过程中发生异常，则抛出异常
     */
    public static Map<String, Object> mainData(JSONArray jsonArray, JSONArray fileJsonArray, List<FormFieldBean> formFields) throws Exception {
        // 创建一个用于存储主要数据的Map对象
        Map<String, Object> mainDataMap = new HashMap<String, Object>();
        String attFieldDisplay = "";
        if (!jsonArray.isEmpty()) {
            for (int i = 0; i < jsonArray.size(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);
                String fieldName = StrKit.str(jsonObject.get("fieldName"));
                String fieldValue = StrKit.str(jsonObject.get("fieldValue"));

                // 遍历formFields列表
                for (FormFieldBean formFieldBean : formFields) {
                    // 获取formFieldBean的desc并去除首尾空格
                    String fieldDesc = formFieldBean.getDesc().trim();
                    if ("FILES".equals(fieldDesc)) {
                        attFieldDisplay = formFieldBean.getDisplay();
                    }
                    // 如果key与fieldDesc相等，则将jsonObject的key对应的值放入mainDataMap中
                    if (fieldName.equals(fieldDesc)) {
                        // 根据表单字段的输入类型，使用数据转换工具对json对象中的指定键值进行转换
                        Object value = DataConversionKit.dataConversion(formFieldBean.getInputType(), fieldValue, fieldDesc);
                        mainDataMap.put(formFieldBean.getDisplay(), StrKit.str(value).trim());
                    }
                }
            }
        }
        // 处理附件,从ftp服务器将附件下载到临时文件中，并上传附件到OA服务器
        if (!fileJsonArray.isEmpty()) {
            // 获取当前用户
            User user = AppContext.getCurrentUser();
            // 获取token
            String tokenId = HttpKit.getToken(user.getLoginName(), tokenUrl);
            // 构造新的文件URL
            String fileUrlNew = fileUrl + tokenId;
            // 创建一个存储附件信息的列表
            List<Map<String, Object>> attsList = new ArrayList<Map<String, Object>>();
            // 生成一个唯一的子引用ID
            Long sub_reference = UUIDLong.longUUID();
            // 遍历文件JSON数组
            for (int i = 0; i < fileJsonArray.size(); i++) {
                // 获取当前文件的JSON对象
                JSONObject fileJsonObject = fileJsonArray.getJSONObject(i);
                // 获取文件名
                String fileName = StrKit.str(fileJsonObject.get("fileName"));
                // 获取文件URL
                String fileUrl = StrKit.str(fileJsonObject.get("fileUrl"));
                String fileUrl_new = "";
                if (fileUrl.contains("SAP文档管理根目录")) {
                    fileUrl_new = "SAP文档管理根目录" + fileUrl.split("SAP文档管理根目录")[1];
                }
                // 下载文件
                File file = FtpKit.downLoadFile(fileName, fileUrl_new);
                if (file != null) {
                    // 创建一个存储附件信息的Map对象
                    Map<String, Object> attMap = new HashMap<String, Object>();
                    // 上传附件
                    String fileResult = HttpKit.uploadFile(fileUrlNew, file);
                    log.info("附件上传成功返回信息:" + fileResult);
                    // 删除文件
                    file.delete();
                    // 获取上传后的附件URL
                    String fileUrl_oa = StrKit.getFileUrl(fileResult);
                    // 设置附件排序
                    int sort = i + 1;
                    // 将附件信息添加到列表中
                    attMap.put("fileUrl", fileUrl_oa);
                    attMap.put("subReference", sub_reference);
                    attMap.put("sort", sort);
                    attsList.add(attMap);
                }
            }
            // 如果存在附件字段，则将子引用ID和附件列表添加到主要数据Map中
            if (!"".equals(attFieldDisplay)) {
                mainDataMap.put(attFieldDisplay, sub_reference);
                mainDataMap.put("thirdAttachments", attsList);
            } else {
                log.info("没有找到附件字段");
            }
        }
        return mainDataMap;
    }


    /**
     * 从JSONArray中获取子数据，并将其存储在Map中
     *
     * @param jsonArray 子数据的JSONArray
     * @param formBean  FormBean对象
     * @return 存储子数据的Map
     * @throws Exception 异常
     */
    public static Map<String, List<Map<String, Object>>> subData(JSONArray jsonArray, FormBean formBean) throws Exception {

        // 创建存储子数据的Map
        Map<String, List<Map<String, Object>>> subDataMap = new HashMap<String, List<Map<String, Object>>>();

        // 遍历JSONArray
        for (int i = 0; i < jsonArray.size(); i++) {
            // 获取子JSONObject
            JSONObject subJsonObject = jsonArray.getJSONObject(i);
            // 获取子表的表名
            String subTableName = StrKit.str(subJsonObject.get("tableDBName"));

            // 根据表名获取FormTableBean对象
            FormTableBean formTableBean = formBean.getTableByTableName(subTableName);

            // 如果FormTableBean对象为空，则输出日志并抛出异常
            if (formTableBean == null) {
                log.info("明细表[tableDBName]的值" + subTableName + "在OA系统中不存在");
                throw new Exception("明细表[tableDBName]的值" + subTableName + "在OA系统中不存在");
            }

            // 如果子JSONObject中包含"workflowRequestTableRecords"键，则继续处理
            if (subJsonObject.containsKey("workflowRequestTableRecords")) {
                // 获取"workflowRequestTableRecords"的JSONArray
                JSONArray tableRecords = subJsonObject.getJSONArray("workflowRequestTableRecords");

                // 如果tableRecords不为空
                if (!tableRecords.isEmpty()) {

                    // 创建存储数据的List
                    List<Map<String, Object>> dataLisyt = new ArrayList<Map<String, Object>>();

                    // 遍历tableRecords
                    for (int j = 0; j < tableRecords.size(); j++) {

                        // 获取当前记录的Map
                        Map<String, Object> dataMap = new HashMap<String, Object>();

                        // 获取当前记录的JSONObject
                        JSONObject tableRecord = tableRecords.getJSONObject(j);

                        // 如果当前记录包含"workflowRequestTableFields"键，则继续处理
                        if (tableRecord.containsKey("workflowRequestTableFields")) {

                            // 获取"workflowRequestTableFields"的JSONArray
                            JSONArray tableFields = tableRecord.getJSONArray("workflowRequestTableFields");

                            // 如果tableFields不为空
                            if (!tableFields.isEmpty()) {

                                // 遍历tableFields
                                for (int k = 0; k < tableFields.size(); k++) {

                                    // 获取当前字段的JSONObject
                                    JSONObject tableField = tableFields.getJSONObject(k);

                                    // 获取字段名和字段值
                                    String fieldName = StrKit.str(tableField.get("fieldName"));
                                    String fieldValue = StrKit.str(tableField.get("fieldValue"));

                                    // 获取FormTableBean中的字段列表
                                    List<FormFieldBean> subTableBeans = formTableBean.getFields();

                                    // 遍历字段列表
                                    for (FormFieldBean formFieldBean : subTableBeans) {
                                        // 获取字段描述并进行去除空格处理
                                        String fieldDesc = formFieldBean.getDesc().trim();

                                        // 如果字段名相等，则进行数据转换并添加到dataMap中
                                        if (fieldName.equals(fieldDesc)) {
                                            // 根据输入类型进行数据转换
                                            Object value = DataConversionKit.dataConversion(formFieldBean.getInputType(), fieldValue, fieldDesc);
                                            dataMap.put(formFieldBean.getDisplay(), StrKit.str(value).trim());
                                        }
                                    }
                                }

                                // 将dataMap添加到dataLisyt中
                                dataLisyt.add(dataMap);
                            }
                        }
                    }

                    // 将dataLisyt添加到subDataMap中
                    subDataMap.put(formTableBean.getTableName(), dataLisyt);
                }
            }
        }

        // 返回subDataMap
        return subDataMap;
    }


}
